package com.example.emb.service.common;

import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@Service
public class MinioService {

    // 日期格式化
    static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("/yyy/MM/dd/");

    // 资源的访问 URL
    @Value("${minio.base-url}")
    private String baseUrl;

    // Minio 客户端
    private final MinioClient client;

    // Bucket 存储桶
    @Value("${minio.bucket}")
    private String bucket;

    public MinioService(@Value("${minio.endpoint}") String endpoint,
                        @Value("${minio.access-key}") String accessKey,
                        @Value("${minio.secret-key}") String secretKey) {
        // 实例化 Minio 客户端
        this.client = MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }

    /**
     * 上传文件到 Minio 服务器，返回访问地址
     *
     * @param file
     * @return
     * @throws Exception
     */
    public String uploadFile(MultipartFile file) throws Exception {
        // 文件大小
        long size = file.getSize();
        if (size == 0) {
            throw new IllegalArgumentException("禁止上传空文件");
        }

        // 文件名称
        String fileName = file.getOriginalFilename();

        // 文件后缀
        String ext = "";

        int index = fileName.lastIndexOf(".");
        if (index == -1) {
            throw new IllegalArgumentException("禁止上传无后缀的文件");
        }

        ext = fileName.substring(index);

        // 文件类型
        String contentType = file.getContentType();
        if (contentType == null) {
            contentType = "application/octet-stream";
        }

        // 根据日期打散目录，使用 UUID 重命名文件
        String filePath = formatter.format(LocalDate.now()) +
                UUID.randomUUID().toString().replace("-", "") +
                ext;

        // 上传文件到客户端
        try (InputStream inputStream = file.getInputStream()) {
            client.putObject(PutObjectArgs.builder()
                    .bucket(bucket)             // 指定 Bucket
                    .contentType(contentType)   // 指定 Content Type
                    .object(filePath)          // 指定文件的路径
                    .stream(inputStream, size, -1) // 文件的 Inputstream 流
                    .build());
        }

        // 返回最终的访问路径
        return baseUrl + bucket + filePath;
    }
    public void deleteFile(String fileUrl) throws Exception {
        // 文件路径
        String filePath = fileUrl.replace(baseUrl + bucket, "");

        // 删除文件
        client.removeObject(RemoveObjectArgs.builder()
                .bucket(bucket)
                .object(filePath)
                .build());
    }
}
